package com.ssyt.yt1.day17;

import java.util.HashSet;
import java.util.Set;

/**
 * HashSet存储自定义对象，这个自定义必须要重写HashCode和equals
 * 
 * @author Administrator
 *
 */
class Person {

	private String name;
	private int age;

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {
		return name.hashCode() + age;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (obj instanceof Person) {
			Person person = (Person) obj;
			if (this.name.equals(person.name) && this.age == person.age) {
				return true;
			}
		}

		return false;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

public class HashSetDemo2 {

	public static void main(String[] args) {
		// HashSet做对象去重：
		// 1、先判断两个对象的HashCode是否相等，如果两个对象的hashCode不相等就不能去重
		// 2、如果两个对象的hashCode相等，还得去判断equals方法
		// 结论：
		// equals相等，hashCode一定相等，equals不相等，hashCode有可能相等
		// 根据以上规则，我们在重写equals，必须重写hashCode，不然在配合HashSet、HashMap、Hashtable等使用时会出一系列BUG！！！
		Set<Person> personSet = new HashSet<Person>();
		personSet.add(new Person("张三", 18));
		personSet.add(new Person("张三", 18));
		personSet.add(new Person("张三", 18));

		System.out.println(personSet);
		// Person person = new Person("张三", 18);
		// Person person2 = new Person("张三", 18);
		// System.out.println(person.hashCode());
		// System.out.println(person2.hashCode());
		// System.out.println(person.equals(person2));
	}
}
